package com.boot2.core.dao.mybatis;

import java.io.Serializable;
import java.util.List;
import java.util.Map;


/**
 * DAO顶层接口
 *
 * @author zhangweilin
 * @version V1.0
 * @date 2016年4月21日 下午5:28:27
 * @description
 */
public interface IBaseGenericDAO<T> {

    /**
     * 保存（持久化）对象
     *
     * @param t 要持久化的对象
     * @return 执行成功的记录个数
     */
    int save(T t);

    /**
     * 保存（持久化）对象
     *
     * @param t 要持久化的对象
     * @return 执行成功的记录个数
     */
    int insert(T t);

    /**
     * 直接执行sqlId
     *
     * @param sqlId
     * @param paramObj
     * @return
     */
    int insert(String sqlId, Object paramObj);

    /**
     * 直接执行sqlId
     *
     * @param sqlId
     * @return
     */
    int insert(String sqlId);

    /**
     * 删除指定的唯一标识符对应的持久化对象
     *
     * @param id 指定的唯一标识符
     * @return 删除的对象数量
     */
    Integer deleteById(Serializable id);

    /**
     * 删除指定的唯一标识符数组对应的持久化对象
     *
     * @param ids 指定的唯一标识符数组
     * @return 删除的对象数量
     */
    Integer deleteByIds(Serializable... ids);

    /**
     * 直接执行sqlId
     *
     * @param sqlId
     * @return
     */
    int delete(String sqlId, Object paramObj);

    /**
     * 直接执行sqlId
     *
     * @param sqlId
     * @return
     */
    int delete(String sqlId);

    /**
     * 直接执行sqlId
     *
     * @param sqlId
     * @return
     */
    int update(String sqlId);

    /**
     * 更新
     *
     * @param t
     * @return
     */
    int update(T t);

    /**
     * 直接执行sqlId
     *
     * @param sqlId
     * @return
     */
    int update(String sqlId, Object paramObj);

    /**
     * 更新（持久化）对象.
     *
     * @param t 更新该参数有值的字段
     * @return
     */
    Integer updateSelectedColumn(T t);

    /**
     * 更新（持久化）对象.
     *
     * @param t            更新该参数有值的字段
     * @param toNullColumn 在使用有值字段更新时，如有 要清空的字段，通过此参数传来,目前该属性不受NotColumn标记影响
     * @return
     */
    Integer updateSelectedColumn(T t, String... toNullColumn);

    /**
     * 更新（持久化）对象
     *
     * @param t 更新所有的字段
     * @return 执行成功的记录个数
     */
    Integer updateAllColumn(T t);

    /**
     * 获取指定的唯一标识符对应的持久化对象
     *
     * @param id 指定的唯一标识符
     * @return 指定的唯一标识符对应的持久化对象，如果没有对应的持久化对象，则返回null。
     */
    <E> E selectById(Serializable id);

    /**
     * 按id批量查
     *
     * @param id
     * @return
     */
    <E> List<E> selectByIds(Serializable... id);

    /**
     * 直接查询sqlId
     *
     * @param sqlId
     * @param paramObj
     * @return
     */
    <E> E selectOne(String sqlId, Object paramObj);

    /**
     * 直接查询sqlId
     *
     * @param sqlId
     * @return
     */
    <E> E selectOne(String sqlId);

    // List<T> selectListByExample(String sqlId, AbstractEntity abstractEntity);

    /**
     * 直接查询sqlId
     *
     * @param sqlId
     * @param paramObj
     * @return
     */
    <E> List<E> selectList(String sqlId, Object paramObj);

    /**
     * 直接查询sqlId
     *
     * @param sqlId
     * @return
     */
    <E> List<E> selectList(String sqlId);

    /**
     * 直接查询sqlId
     *
     * @param sqlId
     * @return
     */
    List<? extends Map<String, ?>> selectListForMap(String sqlId);

    /**
     * 按指定对象模型查询列表
     *
     * @param t
     * @return
     */
    <E> List<E> selectListBySelected(T t);

    /**
     * @param
     * @return List<T>
     * @description 查询表所有数据
     */
    <E> List<E> selectAll();

    /**
     * @param
     * @return List<T>
     * @description 查询表所有数据
     */
    <E> List<E> selectAll(T t);

}
